package api

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"goskeleton/app/utils/response"
	"os"
	"path/filepath"
	"time"
)

type UploadFile struct {
}

func (*UploadFile) UploadHandler(c *gin.Context) {
	// 获取所有上传的文件
	form, err := c.MultipartForm()
	if err != nil {
		zap.L().Error("接收文件失败", zap.Error(err))
		response.Fail(c, 401, "接收文件失败", "")
		return
	}
	files := form.File["file"]

	// yourEndpoint填写Bucket对应的Endpoint，以华东1（杭州）为例，填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	endpoint := "https://oss-cn-hongkong.aliyuncs.com"
	// 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
	accessKeyId := "LTAI5t6AsUdBoEXLycEhes9L"
	accessKeySecret := "35eK6gzOsBXFS96nDny8ae7SsdWPLw"
	// yourBucketName填写存储空间名称。
	bucketName := "bucket781"

	// 创建OSSClient实例。
	client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
	if err != nil {
		handleError(err)
	}
	// 获取存储空间。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		handleError(err)
	}

	var fileURLs []string

	for _, file := range files {
		f, err := file.Open()
		if err != nil {
			zap.L().Error("打开文件失败", zap.Error(err))
			response.Fail(c, 401, "打开文件失败", "")
			return
		}
		defer f.Close()

		// 生成文件名，包含时间戳
		uploadFileName := fmt.Sprintf("secondHand/uploads/%s_%s", time.Now().Format("20060102150405"), filepath.Base(file.Filename))

		// 上传文件。
		err = bucket.PutObject(uploadFileName, f)
		if err != nil {
			zap.L().Error("上传文件失败", zap.Error(err))
			response.Fail(c, 401, "上传文件失败", "")
			return
		}

		// 生成文件URL
		fileURL := fmt.Sprintf("%s/%s", "http://secondhand.asia/", uploadFileName)
		fileURLs = append(fileURLs, fileURL)
	}

	response.Success(c, "文 件上传成功", gin.H{"urls": fileURLs})
}

func handleError(err error) {
	fmt.Println("Error:", err)
	os.Exit(-1)
}
